package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {
        //1.创建真实对象
        lenovo aa=new lenovo();
        //2.动态代理增强lenovo
        /*
        newProxyInstance中的三个参数
           1:类加载器: 真实对象.getClass().getClassLoader()
           2:接口数组: 真实对象.getClass().getInterfaces()
           3:处理器: new InvocationHandler()
             在newProxyInstance中的这三个参数都是固定的写法
        */
        //因为
        //使用JDK动态代理获取lenovo对象的代理对象,代理对象也会在newProxyInstance这一步当中动态去实现接口
        //这里因为代理对象最终都会去实现SaleComputer接口,所以可以用SaleComputer来接
       SaleComputer cc= (SaleComputer) Proxy.newProxyInstance(aa.getClass().getClassLoader(),//类加载器,加载动态生成的代理对象
                                                              aa.getClass().getInterfaces(),//动态生成的代理对象要实现的接口
                                                              new InvocationHandler() { //动态生成的代理对象自动调用的扩展代码InvocationHandler接口的实例化对象
           /*
             代理逻辑编写的方法: 指的就是invoke方法,并且我们代理对象调用了任何一个方法都会触发该方法执行
                 invoke中的三个参数:
                   1: o指的是代理对象与上面的cc是一个对象.一般用不到
                   2: method:代理对象调用的方法,被封装为的对象,也就是记录了我们在第三步中调用了那一个方法.可用method.getName来查看
                   3: objects:代理对象调用的方法适合,所传递的实际参数.
           */
           //今后写了代理模式之后我们就直接讲需要扩展的代码写进invoke方法中就可以
           @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
               /*System.out.println(method.getName());
               System.out.println(objects[0]);*/


               return null;
            }
        });//匿名内部类

        //3.调用方法
        String bb = cc.sale(8000);
        System.out.println(bb);
    }
}
